home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Misc / RZToDoList / Source / tdcPasteboard.m < prev    next >
Encoding:
Text File  |  1995-06-12  |  3.1 KB  |  139 lines

  1. /* 
  2.  * tdcPasteboard - pasteboard functions for the ToDoController
  3.  *
  4.  * You may freely copy, distribute and reuse the code in this example.
  5.  * This code is provided AS IS without warranty of any kind, expressed 
  6.  * or implied, as to its fitness for any particular use.
  7.  *
  8.  * Copyright 1995 Ralph Zazula (zazula@next.com).  All Rights Reserved.
  9.  *
  10.  */
  11.  
  12. #import "ToDoController.h"
  13. #import "ToDoItem.h"
  14.  
  15. const char *ToDoListPBoardType = "ToDoList v1.0 Item Pasteboard";
  16. extern BOOL IncludesType(const NXAtom *types, NXAtom type);
  17.  
  18. @implementation ToDoController(Pasteboard)
  19.  
  20. - copy:sender
  21. {
  22.     if(![self copyToPasteboard:[Pasteboard new]]) {
  23.         NXBeep();
  24.         return nil;
  25.     }
  26.     return self;
  27. }
  28.  
  29. - paste:sender
  30. {
  31.     if(![self pasteFromPasteboard:[Pasteboard new]]) {
  32.         NXBeep();
  33.         return nil;
  34.     }
  35.     return self;
  36. }
  37.  
  38. - cut:sender
  39. {
  40.     if([self copy:self]) {
  41.         [self delete:self];
  42.     }
  43.     return self;
  44. }
  45.  
  46. - delete:sender
  47. {
  48.     [self remove:self];
  49.     return self;
  50. }
  51.  
  52. /*** utility methods used by cut/copy/paste and services ***/
  53.  
  54. - copyToPasteboard:(Pasteboard *)pboard
  55. {
  56.     const char *myTypes[3] = {NXAsciiPboardType, ToDoListPBoardType, NULL};
  57.     NXStream *stream;
  58.     BOOL failed = NO;
  59.     id itemList = [self selectedItems];
  60.     
  61.     ToDoListPBoardType = NXUniqueStringNoCopy(ToDoListPBoardType);
  62.  
  63.     if(itemList && [itemList count]) {
  64.         int i;
  65.         char *buf;
  66.         int len;
  67.         
  68.         /* declare the two types */
  69.         [pboard declareTypes:myTypes num:2 owner:NULL];
  70.  
  71.         /* write the ASCII representation */
  72.         NX_DURING
  73.         stream = NXOpenMemory(NULL, 0, NX_READWRITE);
  74.         for(i=0; i<[itemList count]; i++) {
  75.             [[itemList objectAt:i] writeToStream:stream];
  76.             NXPrintf(stream, "\n");
  77.         }
  78.         [pboard writeType:NXAsciiPboardType fromStream:stream];
  79.         NXCloseMemory(stream, NX_FREEBUFFER);
  80.         NX_HANDLER
  81.         failed = YES;
  82.         NX_ENDHANDLER
  83.         
  84.         /* write the internal representation */
  85.         buf = NXWriteRootObjectToBuffer(itemList, &len);
  86.         [pboard writeType:ToDoListPBoardType data:buf length:len];
  87.         NXFreeObjectBuffer(buf, len);
  88.         
  89.         /* return status */
  90.         return failed ? nil : self;
  91.     }
  92.         
  93.     return nil;    
  94. }
  95.  
  96. - pasteFromPasteboard:(Pasteboard *)pboard
  97. {
  98.    const char * const *types;
  99.     char *data;
  100.     int len;
  101.     id pasteList;
  102.     
  103.     ToDoListPBoardType = NXUniqueStringNoCopy(ToDoListPBoardType);
  104.  
  105.     types = [pboard types];
  106.     if(IncludesType(types, ToDoListPBoardType)) {
  107.         if([pboard readType:ToDoListPBoardType data:&data length:&len]) {
  108.             pasteList = NXReadObjectFromBuffer(data, len);
  109.             [todoList appendList:pasteList];
  110.             [pboard deallocatePasteboardData:data length:len];
  111.             [self dirty:nil];
  112.             [self update];
  113.             [self selectItem:[pasteList objectAt:0]];
  114.             pasteList = [pasteList free];
  115.         }
  116.     } else {
  117.         /* check for ASCII or RTF data on pboard */
  118.         NXStream *s = NULL;
  119.         if(IncludesType(types, NXRTFPboardType)) {
  120.             s = [pboard readTypeToStream:NXRTFPboardType];
  121.         } else if(IncludesType(types, NXAsciiPboardType)) {
  122.             s = [pboard readTypeToStream:NXAsciiPboardType];
  123.         }
  124.         if(s) {
  125.             id item = [[ToDoItem alloc] init];
  126.             [item setSubject:"<Pasteboard>"];
  127.             [item setDataFromStream:s];
  128.             NXCloseMemory(s, NX_FREEBUFFER);            
  129.             [todoList addObject:item];
  130.             [self dirty:nil];
  131.             [self update];
  132.             [self selectItem:item];
  133.         }
  134.     }            
  135.     return self;
  136. }
  137.  
  138. @end
  139.